package com.passion.fs.controller;

import cn.dev33.satoken.stp.StpUtil;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.passion.common.base.ResultVO;
import com.passion.common.util.StringUtils;
import com.passion.fs.context.LocalFsContext;
import com.passion.fs.core.FileSystem;
import com.passion.fs.entity.FileInfo;
import com.passion.fs.vo.DirInfoVO;
import com.passion.fs.vo.DtreeNode;
import com.passion.fs.vo.FileInfoVO;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 类描述：文件管理控制器
 *
 * @author ZhuYin
 * @since 2025年01月07日
 */
@Slf4j
@RestController
@RequestMapping("/file")
public class FileController {

    @Resource
    private FileSystem fileSystem;

    /**
     * 方法说明：查询目录下的文件夹及文件
     *
     * @param dirId 目录id
     * @return 返回目录下的文件夹及文件集合
     * @author ZhuYin
     * @since 2025年01月08日
     */
    @ApiOperationSupport(author = "ZhuYin", order = 10)
    @ApiOperation("查询目录下的文件夹及文件")
    @GetMapping({"", "/list"})
    public ResultVO<List<FileInfo>> list(String dirId) {
        List<FileInfo> fileInfoList = LocalFsContext.fileInfoService.listByDirId(dirId);
        return ResultVO.getSuccess(fileInfoList);
    }

    /**
     * 方法说明：查询目录信息
     *
     * @param dirId 点击的目录id
     * @return 返回目录信息
     * @author ZhuYin
     * @since 2025年01月08日
     */
    @ApiOperationSupport(author = "ZhuYin", order = 20)
    @ApiOperation("查询目录信息")
    @GetMapping("/getDirInfo")
    public ResultVO<DirInfoVO> getDirInfo(String dirId) {
        DirInfoVO dirInfoVO = LocalFsContext.fileInfoService.getDirInfo(dirId);
        return ResultVO.getSuccess(dirInfoVO);
    }

    /**
     * 方法说明：上传文件测试
     *
     * @param dirId  待上传的目录id
     * @param file  待上传的文件集合
     * @return 返回上传之后的文件信息
     * @author ZhuYin
     * @since 2025年01月06日
     */
    @ApiOperationSupport(author = "ZhuYin", order = 30)
    @ApiOperation("上传文件")
    @PostMapping(value = "/uploadFiles", headers = "content-type=multipart/form-data", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public ResultVO<List<FileInfoVO>> uploadFiles(@RequestParam(required = false) String dirId, @RequestPart @RequestParam MultipartFile[] file) {
        if (StringUtils.isBlank(dirId)) {
            dirId = "/";
        }
        String userId = StpUtil.getLoginIdAsString();
        List<FileInfoVO> fileInfoVos = fileSystem.uploadFiles(userId, dirId, file);
        return ResultVO.getSuccess(fileInfoVos);
    }

    @ApiOperationSupport(author = "ZhuYin", order = 35)
    @ApiOperation("查询文件上传进度")
    @GetMapping("/percent")
    public ResultVO<String> percent(String fileId) {
        return ResultVO.getSuccess("100");
    }
    @ApiOperationSupport(author = "ZhuYin", order = 36)
    @ApiOperation("重置上传进度")
    @GetMapping("/percentReset")
    public ResultVO<String> percentReset() {
        return ResultVO.getSuccess("0");
    }

    /**
     * 方法说明：创建文件夹
     *
     * @param dirId  当前文件夹ID
     * @param name   待创建的文件夹名称
     * @return 【t_fs_file_info】表实体类;
     * @author ZhuYin
     * @since 2025年01月08日
     */
    @ApiOperationSupport(author = "ZhuYin", order = 40)
    @ApiOperation("创建文件夹")
    @PostMapping("/createFolder")
    public FileInfo createFolder(String dirId, String name) {
        String userId = StpUtil.getLoginIdAsString();
        return fileSystem.createFolder(userId, dirId, name);
    }

    /**
     * 方法说明：获取目录管理节点列表
     *
     * @return 返回所有的节点
     * @author ZhuYin
     * @since 2025年01月09日
     */
    @ApiOperationSupport(author = "ZhuYin", order = 50)
    @ApiOperation("目录管理列表")
    @GetMapping("/getTree")
    public List<DtreeNode> getTree() {
        return LocalFsContext.fileInfoService.getTree();
    }

    /**
     * 方法说明：获取文件夹节点
     *
     * @return 返回所有文件夹节点
     * @author ZhuYin
     * @since 2025年01月09日
     */
    @ApiOperationSupport(author = "ZhuYin", order = 60)
    @ApiOperation("获取目录节点列表")
    @GetMapping("/getDirTree")
    public List<DtreeNode> getDirTree() {
        return LocalFsContext.fileInfoService.getDirTree();
    }

    /**
     * 方法说明：删除树节点
     *
     * @param id 树节点id
     * @return true-成功 false-失败
     * @author ZhuYin
     * @since 2025年01月09日
     */
    @ApiOperationSupport(author = "ZhuYin", order = 70)
    @ApiOperation("删除树节点")
    @PostMapping("/deleteTreeNode")
    public Boolean deleteTreeNode(String id) {
        return LocalFsContext.fileInfoService.deleteTreeNode(id);
    }

    /**
     * 方法说明：根据文件ID下载文件
     *
     * @param id  文件id
     * @author ZhuYin
     * @since 2025年01月09日
     */
    @ApiOperationSupport(author = "ZhuYin", order = 80)
    @ApiOperation("根据文件ID下载文件")
    @GetMapping("/download")
    public void download(String id, HttpServletResponse response) {
        LocalFsContext.fileInfoService.download(id, response);
    }
}
